package cloud.seri.iot.aliyun

import com.aliyuncs.DefaultAcsClient
import com.aliyuncs.exceptions.ClientException
import com.aliyuncs.iot.model.v20180120.*

class ThingModelManager(private val client: DefaultAcsClient)
{

    /**
     * 设置设备的属性
     *
     * @param IotId      要查询的设备ID
     * @param ProductKey 设备所隶属的产品Key
     * @param DeviceName 设备名称
     * @param Items  要设置的属性信息，组成为key:value，数据格式为 JSON String。  必须
     *
     * @Des 描述：
     */
    @Throws(ClientException::class)
    fun setDeviceProperty(IotId: String? = null, ProductKey: String? = null, DeviceName: String? = null, Items: String): SetDevicePropertyResponse?
    {
        val request = SetDevicePropertyRequest()
        request.deviceName = DeviceName
        request.iotId = IotId
        request.items = Items
        request.productKey = ProductKey
        return client.getAcsResponse(request)

    }

    /**
     * 批量设置设备属性
     *
     * @param ProductKey      设置属性的设备所隶属的产品Key
     * @param DeviceNames     要设置属性的设备名称列表。目前，最多支持500个设备
     * @param Items  要设置的属性信息，组成为key:value，数据格式为 JSON String。  必须
     *
     * @Des 描述：
     */
    @Throws(ClientException::class)
    fun setDevicesProperty(ProductKey: String, DeviceNames: List<String>, Items: String): SetDevicesPropertyResponse?
    {
        val request = SetDevicesPropertyRequest()
        request.deviceNames = DeviceNames
        request.items = Items
        request.productKey = ProductKey
        return client.getAcsResponse(request)
    }

    /**
     * 在一个设备上执行指定的服务（调用设备服务）
     *
     * @param IotId      要查询的设备ID
     * @param ProductKey 设备所隶属的产品Key
     * @param DeviceName 设备的名称
     * @param Identifier 高级版设备的服务Identifier  必须
     * @param Args       要启用服务的入参信息    必须
     * @Des 描述：
     */
    @Throws(ClientException::class)
    fun invokeThingService(IotId: String? = null, ProductKey: String? = null, DeviceName: String? = null,
                           Identifier: String, Args: String): InvokeThingServiceResponse?
    {
        val request = InvokeThingServiceRequest()
        request.args = Args
        request.deviceName = DeviceName
        request.iotId = IotId
        request.identifier = Identifier
        request.productKey = ProductKey
        return client.getAcsResponse(request)
    }


    /**
     * 批量调用设备服务
     *
     * @param IotId      要查询的设备ID  必须
     * @param ProductKey 设备所隶属的产品Key  必须
     * @param DeviceNames 设备的名称列表。最多支持500个设备  必须
     * @param Identifier  高级版设备的服务Identifier  必须
     * @param Args 要启用服务的入参信息  必须
     *
     * @Des 描述：
     */
    @Throws(ClientException::class)
    fun invokeThingsService(ProductKey: String, DeviceNames: List<String>,
                            Identifier: String, Args: String): InvokeThingsServiceResponse?
    {
        val request = InvokeThingsServiceRequest()
        request.args = Args
        request.identifier = Identifier
        request.deviceNames = DeviceNames
        request.productKey = ProductKey

        return client.getAcsResponse(request)
    }


    /**
     * 查询指定设备的属性快照
     *
     * @param IotId      要查询的设备ID  必须
     * @param ProductKey 设备所隶属的产品Key  必须
     * @param DeviceName 设备的名称列表。最多支持500个设备  必须
     *
     * @Des 描述：
     */
    @Throws(ClientException::class)
    fun queryDevicePropertyStatus(IotId: String? = null, ProductKey: String? = null, DeviceName: String? = null): QueryDevicePropertyStatusResponse?
    {

        val request = QueryDevicePropertyStatusRequest()
        request.deviceName = DeviceName
        request.iotId = IotId
        request.productKey = ProductKey

        return client.getAcsResponse(request)
    }


    /**
     * 查询指定设备的事件记录
     *
     * @param IotId      要查询的设备ID
     * @param ProductKey 设备所隶属的产品Key
     * @param DeviceName 设备的名称
     * @param EventType  事件类型  info：信息。alert：告警 。 error：故障。
     * @param Identifier 事件标识符   必须
     * @param StartTime  要查询的事件记录的开始时间    必须
     * @param EndTime    要查询的事件记录的结束时间    必须
     * @param PageSize   返回结果中每页显示的记录数
     * @param Asc        排序方式
     *
     * @Des 描述：
     */
    @Throws(ClientException::class)
    fun queryDeviceEventData(IotId: String? = null, ProductKey: String? = null, DeviceName: String? = null, EventType: String? = null,
                             Identifier: String,
                             StartTime: Long, EndTime: Long, PageSize: Int? = null, Asc: Int? = null): QueryDeviceEventDataResponse?
    {
        val request = QueryDeviceEventDataRequest()
        request.asc = Asc
        request.deviceName = DeviceName
        request.endTime = EndTime
        request.eventType = EventType
        request.iotId = IotId
        request.startTime = StartTime
        request.identifier = Identifier
        request.pageSize = PageSize
        request.productKey = ProductKey

        return client.getAcsResponse(request)
    }


    /**
     * 查询指定设备的属性记录
     *
     * @param IotId      要查询的设备ID
     * @param ProductKey 设备所隶属的产品Key
     * @param DeviceName 设备的名称
     * @param Identifier 事件标识符   必须
     * @param StartTime  要查询的事件记录的开始时间    必须
     * @param EndTime    要查询的事件记录的结束时间    必须
     * @param PageSize   返回结果中每页显示的记录数
     * @param Asc        排序方式
     *
     * @Des 描述：
     */
    @Throws(ClientException::class)
    fun queryDevicePropertyData(IotId: String? = null, ProductKey: String? = null, DeviceName: String? = null,
                                Identifier: String,
                                StartTime: Long, EndTime: Long, PageSize: Int, Asc: Int): QueryDevicePropertyDataResponse?
    {
        val request = QueryDevicePropertyDataRequest()
        request.asc = Asc
        request.productKey = ProductKey
        request.iotId = IotId
        request.deviceName = DeviceName
        request.identifier = Identifier
        request.startTime = StartTime
        request.endTime = EndTime
        request.pageSize = PageSize
        return client.getAcsResponse(request)
    }


    /**
     * 查询指定设备的服务记录
     *
     * @param IotId      要查询的设备ID
     * @param ProductKey 设备所隶属的产品Key
     * @param DeviceName 设备的名称
     * @param Identifier 事件标识符   必须
     * @param StartTime  要查询的事件记录的开始时间    必须
     * @param EndTime    要查询的事件记录的结束时间    必须
     * @param PageSize   返回结果中每页显示的记录数
     * @param Asc        排序方式
     *
     * @Des 描述：
     */
    @Throws(ClientException::class)
    fun queryDeviceServiceData(IotId: String? = null, ProductKey: String? = null, DeviceName: String? = null,
                               Identifier: String,
                               StartTime: Long, EndTime: Long, PageSize: Int? = null, Asc: Int? = null): QueryDeviceServiceDataResponse?
    {
        val request = QueryDeviceServiceDataRequest()
        request.asc = Asc
        request.deviceName = DeviceName
        request.endTime = EndTime
        request.identifier = Identifier
        request.iotId = IotId
        request.startTime = StartTime
        request.pageSize = PageSize
        request.productKey = ProductKey


        return client.getAcsResponse(request)

    }


    /**
     * 查询指定设备的属性上报数据
     *
     * @param IotId      要查询的设备ID
     * @param ProductKey 设备所隶属的产品Key
     * @param DeviceName 设备的名称
     * @param StartTime  要查询的事件记录的开始时间    必须
     * @param EndTime    要查询的事件记录的结束时间    必须
     * @param PageSize   返回结果中每页显示的记录数
     * @param Asc        排序方式
     *
     * @Des 描述：
     */
    @Throws(ClientException::class)
    fun queryDevicePropertiesData(IotId: String? = null, ProductKey: String? = null, DeviceName: String? = null,
                                  Identifiers: List<String>,
                                  StartTime: Long, EndTime: Long, PageSize: Int, Asc: Int): QueryDevicePropertiesDataResponse?
    {
        val request = QueryDevicePropertiesDataRequest()
        request.asc = Asc
        request.iotId = IotId
        request.productKey = ProductKey
        request.deviceName = DeviceName
        request.identifiers = Identifiers
        request.startTime = StartTime
        request.endTime = EndTime
        request.pageSize = PageSize
        return client.getAcsResponse(request)
    }

}
